home *** CD-ROM | disk | FTP | other *** search
/ Mac Power 1997 December / MACPOWER-1997-12.ISO.7z / MACPOWER-1997-12.ISO / AMUG / PROGRAMMING / Raven 1.2.sit / Raven 1.2 / Source / Foundation / OS / ZProcess.cpp < prev    next >
Text File  |  1997-03-30  |  8KB  |  324 lines

  1. /*
  2.  *  File:        ZProcess.cpp
  3.  *  Summary:    Some handy functions dealing with the Process Manager.
  4.  *  Written by:    Jesse Jones
  5.  *
  6.  *  Copyright ゥ 1996 Jesse Jones. 
  7.  *    For conditions of distribution and use, see copyright notice in ZTypes.h  
  8.  *
  9.  *  Change History (most recent first):    
  10.  *
  11.  *         <->     1/13/97    JDJ        Created
  12.  */
  13.  
  14. #include <ZProcess.h>
  15.  
  16. #include <AppleEvents.h>
  17.  
  18. #include <ZDebug.h>
  19. #include <ZExceptions.h>
  20.  
  21.  
  22. // ===================================================================================
  23. //    class UProcess
  24. // ===================================================================================
  25.  
  26. //---------------------------------------------------------------
  27. //
  28. // UProcess::InFront ()                                    [static]
  29. //
  30. //---------------------------------------------------------------
  31. bool UProcess::InFront()
  32. {
  33.     ProcessSerialNumber    psn = {0, kCurrentProcess};
  34.  
  35.     return UProcess::InFront(psn);
  36. }
  37.  
  38.  
  39. //---------------------------------------------------------------
  40. //
  41. // UProcess::PullToFront ()                                [static]
  42. //
  43. //---------------------------------------------------------------
  44. void UProcess::PullToFront()
  45. {
  46.     ProcessSerialNumber    psn = {0, kCurrentProcess};
  47.  
  48.     UProcess::PullToFront(psn);
  49. }
  50.  
  51.  
  52. //---------------------------------------------------------------
  53. //
  54. // UProcess::Kill ()                                    [static]
  55. //
  56. //---------------------------------------------------------------
  57. void UProcess::Kill()
  58. {
  59.     ProcessSerialNumber    psn = {0, kCurrentProcess};
  60.  
  61.     UProcess::Kill(psn);
  62. }
  63.  
  64.  
  65. //---------------------------------------------------------------
  66. //
  67. // UProcess::InFront (ProcessSerialNumber)                [static]
  68. //
  69. //---------------------------------------------------------------
  70. bool UProcess::InFront(const ProcessSerialNumber& psn)
  71. {
  72.     Boolean inFront = true;
  73.  
  74.     ProcessSerialNumber    frontPSN;
  75.     OSErr err = GetFrontProcess(&frontPSN);
  76.     if (err == noErr)
  77.         err = SameProcess(&psn, &frontPSN, &inFront);
  78.     
  79.     ASSERT(err == noErr);
  80.     
  81.     return inFront;
  82. }
  83.  
  84.  
  85. //---------------------------------------------------------------
  86. //
  87. // UProcess::PullToFront (ProcessSerialNumber)            [static]
  88. //
  89. //---------------------------------------------------------------
  90. void UProcess::PullToFront(const ProcessSerialNumber& psn)
  91. {
  92.     OSErr err = SetFrontProcess(&psn);
  93.     ASSERT(err == noErr);
  94. }
  95.  
  96.  
  97. //---------------------------------------------------------------
  98. //
  99. // UProcess::IsRunning (OSType)                            [static]
  100. //
  101. //---------------------------------------------------------------
  102. bool UProcess::IsRunning(OSType signature)
  103. {
  104.     ProcessSerialNumber psn = {0, kNoProcess};
  105.  
  106.     bool found = false;    
  107.     OSErr err = noErr;
  108.     
  109.     ProcessInfoRec info;        
  110.     info.processInfoLength = sizeof(ProcessInfoRec);
  111.     info.processName       = nil;
  112.     info.processAppSpec    = nil;
  113.     info.processLocation   = nil;
  114.     
  115.     while (!found && err == noErr) {
  116.         err = GetNextProcess(&psn);
  117.         if (psn.highLongOfPSN == 0 && psn.lowLongOfPSN == kNoProcess)
  118.             err = procNotFound;
  119.             
  120.         if (err == noErr) {
  121.             err = GetProcessInformation(&psn, &info);
  122.             
  123.             found = err == noErr && info.processSignature == signature;
  124.         }
  125.     }
  126.     
  127.     return found;    
  128. }
  129.  
  130.  
  131. //---------------------------------------------------------------
  132. //
  133. // UProcess::IsRunning (OSType, OSType)                    [static]
  134. //
  135. //---------------------------------------------------------------
  136. bool UProcess::IsRunning(OSType type, OSType creator)
  137. {
  138.     ProcessSerialNumber psn = {0, kNoProcess};
  139.  
  140.     bool found = false;    
  141.     OSErr err = noErr;
  142.     
  143.     ProcessInfoRec info;        
  144.     info.processInfoLength = sizeof(ProcessInfoRec);
  145.     info.processName       = nil;
  146.     info.processAppSpec    = nil;
  147.     info.processLocation   = nil;
  148.     
  149.     while (!found && err == noErr) {
  150.         err = GetNextProcess(&psn);
  151.         if (psn.highLongOfPSN == 0 && psn.lowLongOfPSN == kNoProcess)
  152.             err = procNotFound;
  153.             
  154.         if (err == noErr) {
  155.             err = GetProcessInformation(&psn, &info);
  156.             
  157.             found = err == noErr && info.processType == type && info.processSignature == creator;
  158.         }
  159.     }
  160.     
  161.     return found;    
  162. }
  163.  
  164.  
  165. //---------------------------------------------------------------
  166. //
  167. // UProcess::Kill (ProcessSerialNumber)                    [static]
  168. //
  169. //---------------------------------------------------------------
  170. void UProcess::Kill(const ProcessSerialNumber& psn)
  171. {
  172.     AEDesc         target = {typeNull, nil};
  173.     AppleEvent    event  = {typeNull, nil};
  174.  
  175.     try {
  176.         OSErr err = AECreateDesc(typeProcessSerialNumber, &psn, sizeof(ProcessSerialNumber), &target);
  177.         ThrowIfOSErr(err);
  178.  
  179.         err = AECreateAppleEvent(kCoreEventClass, kAEQuitApplication, &target, kAutoGenerateReturnID, kAnyTransactionID, &event);
  180.         ThrowIfOSErr(err);
  181.  
  182.         AppleEvent reply = {typeNull, nil};
  183.         err = AESend(&event, &reply, kAENoReply, kAENormalPriority, kAEDefaultTimeout, nil, nil);
  184.         ThrowIfOSErr(err);
  185.  
  186.         AEDisposeDesc(&target);
  187.         AEDisposeDesc(&event);
  188.         
  189.     } catch (...) {
  190.         AEDisposeDesc(&target);
  191.         AEDisposeDesc(&event);
  192.         
  193.         throw;
  194.     }
  195. }
  196.  
  197.  
  198. //---------------------------------------------------------------
  199. //
  200. // UProcess::GetFrontSerialNumber                        [static]
  201. //
  202. //---------------------------------------------------------------
  203. ProcessSerialNumber UProcess::GetFrontSerialNumber()
  204. {
  205.     ProcessSerialNumber psn;
  206.     
  207.     OSErr err = GetFrontProcess(&psn);
  208.     ThrowIfOSErr(err);
  209.     
  210.     return psn;
  211. }
  212.  
  213.  
  214. //---------------------------------------------------------------
  215. //
  216. // UProcess::GetSerialNumber ()                            [static]
  217. //
  218. //---------------------------------------------------------------
  219. ProcessSerialNumber UProcess::GetSerialNumber()
  220. {
  221.     ProcessSerialNumber psn;
  222.     
  223.     OSErr err = GetCurrentProcess(&psn);
  224.     ThrowIfOSErr(err);
  225.     
  226.     return psn;
  227. }
  228.  
  229.  
  230. //---------------------------------------------------------------
  231. //
  232. // UProcess::GetSerialNumber (OSType)                    [static]
  233. //
  234. //---------------------------------------------------------------
  235. ProcessSerialNumber UProcess::GetSerialNumber(OSType signature)
  236. {
  237.     ProcessSerialNumber psn = {0, kNoProcess};
  238.  
  239.     bool found = false;    
  240.     OSErr err = noErr;
  241.     
  242.     ProcessInfoRec info;        
  243.     info.processInfoLength = sizeof(ProcessInfoRec);
  244.     info.processName       = nil;
  245.     info.processAppSpec    = nil;
  246.     info.processLocation   = nil;
  247.     
  248.     while (!found && err == noErr) {
  249.         err = GetNextProcess(&psn);
  250.         if (psn.highLongOfPSN == 0 && psn.lowLongOfPSN == kNoProcess)
  251.             err = procNotFound;
  252.             
  253.         if (err == noErr) {
  254.             err = GetProcessInformation(&psn, &info);
  255.             
  256.             found = err == noErr && info.processSignature == signature;
  257.         }
  258.     }
  259.     
  260.     if (!found)
  261.         ThrowOSErr(procNotFound);
  262.     
  263.     return psn;    
  264. }
  265.  
  266.  
  267. //---------------------------------------------------------------
  268. //
  269. // UProcess::GetSerialNumber (OSType, OSType)            [static]
  270. //
  271. //---------------------------------------------------------------
  272. ProcessSerialNumber UProcess::GetSerialNumber(OSType type, OSType creator)
  273. {
  274.     ProcessSerialNumber psn = {0, kNoProcess};
  275.  
  276.     bool found = false;    
  277.     OSErr err = noErr;
  278.     
  279.     ProcessInfoRec info;        
  280.     info.processInfoLength = sizeof(ProcessInfoRec);
  281.     info.processName       = nil;
  282.     info.processAppSpec    = nil;
  283.     info.processLocation   = nil;
  284.     
  285.     while (!found && err == noErr) {
  286.         err = GetNextProcess(&psn);
  287.         if (psn.highLongOfPSN == 0 && psn.lowLongOfPSN == kNoProcess)
  288.             err = procNotFound;
  289.             
  290.         if (err == noErr) {
  291.             err = GetProcessInformation(&psn, &info);
  292.             
  293.             found = err == noErr && info.processType == type && info.processSignature == creator;
  294.         }
  295.     }
  296.     
  297.     if (!found)
  298.         ThrowOSErr(procNotFound);
  299.     
  300.     return psn;    
  301. }
  302.  
  303.  
  304. //---------------------------------------------------------------
  305. //
  306. // UProcess::GetInfo                                    [static]
  307. //
  308. //---------------------------------------------------------------
  309. ProcessInfoRec UProcess::GetInfo(const ProcessSerialNumber& psn)
  310. {
  311.     ProcessInfoRec info;
  312.     
  313.     info.processInfoLength = sizeof(ProcessInfoRec);
  314.     info.processName       = nil;
  315.     info.processAppSpec    = nil;
  316.     info.processLocation   = nil;
  317.     
  318.     OSErr err = GetProcessInformation(&psn, &info);
  319.     ThrowIfOSErr(err);
  320.     
  321.     return info;
  322. }
  323.  
  324.